Skip to content

Conversation

jwasinger
Copy link
Contributor

@jwasinger jwasinger commented Jul 23, 2025

WIP. currently passes blockchain spec tests (tests that make use of balances >16 bytes are excluded).

Change summary:

  • when --experimentalbal is enabled:
    • insertion of post-Cancun blocks which don't contain access lists will cause them to be created during block execution and embedded into the block body.
    • Insertion of post-cancun blocks that contain access lists will perform transaction execution and post-state root calculation in parallel using the state diffs provided in the access list. The state diffs produced by execution are validated against the entries in the BAL.
  • Introduced new modified blockchain suite test runner which first imports the test chain (generating BALs), and then re-inserts the access-list-containing blocks.

Deviations from EIP-7928:

  • Use RLP for the encoding format instead of SSZ.
  • Modify BAL format to accomodate pre/post-tx execution state changes:
    • entries with txindex=0 correspond to state reads/changes which occur from system contract execution before transactions.
    • entries with txindx=1..len(block.transactions) correspond to state reads/changes occurring for each transaction.
    • entries with txindex=len(block.transactions)+1 correspond to the post-block system contracts and EIP-4895 withdrawals.

TODO:

  • validation of BAL account/storage reads (it's somewhat likely that these will be removed from the spec, so I'm holding off for now).

@jwasinger
Copy link
Contributor Author

A lot of the comments in the code are straight-up wrong/misleading. There's a lot of notes/reminders I made as I was implementing this, and not all of them have been removed/corrected at this point.

@jwasinger
Copy link
Contributor Author

jwasinger commented Jul 29, 2025

I've pushed parallel execution changes here.

Still failing 2 tests (other than modexp repricing ones which will be fixed with a rebase on master):

--- FAIL: TestExecutionSpecBlocktestsBAL/prague/eip7251_consolidations/consolidations_during_fork/consolidation_requests_during_fork.json (0.03s)
        block_test.go:233: test with config {snapshotter:false, scheme:path} failed: mismatch between BAl value and computed value
    --- FAIL: TestExecutionSpecBlocktestsBAL/prague/eip7002_el_triggerable_withdrawals/withdrawal_requests_during_fork/withdrawal_requests_during_fork.json (0.02s)
        block_test.go:233: test with config {snapshotter:false, scheme:path} failed: mismatch between BAl value and computed value

I've been trying to debug these but it's proving to be exceedingly difficult with the parallel execution enabled. The tests seem to relate to behavior of some system contracts on the fork boundaries, so I will just proceed with gathering numbers on mainnet performance for the meantime.

@jwasinger jwasinger force-pushed the bal-execution branch 2 times, most recently from ab1c562 to 8f200db Compare August 4, 2025 08:51
@jwasinger jwasinger marked this pull request as ready for review August 4, 2025 10:13
@jwasinger
Copy link
Contributor Author

INFO [08-04|13:21:15.227] Imported new chain segment number=23,051,616 hash=228379..13abd2 blocks=0 txs=10783 mgas=1137.280 elapsed=8.072s mgasps=140.878 age=2d6h46m triediffs=271.84MiB triedirty=112.48MiB

Broke the block count on the insertion log statement here. Will try to fix tomorrow.

@jwasinger
Copy link
Contributor Author

Getting some empty accounts in the BAL. example:

 {
      address: "0xff00000000000000000000000000000000008453"
  }

rjl493456442 and others added 14 commits August 15, 2025 11:40
…hen enabled, post-Cancun blocks which lack access lists will have them constructed on execution during import. When importing blocks which contain access lists, transaction execution and state root calculation is performed in parallel.
…ved from BALs, there's not much gain from having a BAL state prefetcher
…ulation in statedb across multiple calls to Finalise. instead, Finalise now returns the diff that occurred from that call
Copy link
Member

@lightclient lightclient left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looking good so far, just a few comments.

var resCh chan *ProcessResultWithMetrics
resCh, err = bc.processor.ProcessWithAccessList(block, statedb, bc.cfg.VmConfig)
if err != nil {
// TODO: okay to pass nil here as execution result?
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should be fine, we just use it to get out the receipts (if it is non nil).

@jwasinger
Copy link
Contributor Author

jwasinger commented Aug 27, 2025

We decided on the EIP breakout call to keep account/storage reads in for now. Basically, without having this information it is possible that a transaction can be crafted which does a ton of storage reads and slow down the processing of the block significantly.

So until we can evaluate worst-cases here, account/storage reads are staying in the spec.

bc.prefetcher.Prefetch(block, throwaway, vmCfg, &interrupt)
if block.Body().AccessList == nil {
// only use the state prefetcher for non-BAL blocks.
bc.prefetcher.Prefetch(block, throwaway, vmCfg, &interrupt)
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I previously implemented a state prefetcher for BALs. I deleted it so that the import benchmarks I am running will capture the BAL block processing speed equivalent to a synced node executing blocks at chain head.

We should probably add back the BAL prefetcher and measure the import performance.

@jwasinger
Copy link
Contributor Author

Also TODO: need to implement validation of storage/account reads against the BAL.

@@ -118,6 +120,14 @@ type StateDB struct {
// The tx context and all occurred logs in the scope of transaction.
thash common.Hash
txIndex int
sender common.Address
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

remove trhis.

@@ -118,6 +120,14 @@ type StateDB struct {
// The tx context and all occurred logs in the scope of transaction.
thash common.Hash
txIndex int
sender common.Address
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

leftover, remove

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this should not be committed

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah, it's leftover test data for a unit test that no longer exists (but should be updated and added back in).

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants